// TCPServer.hpp
#ifndef TCPSERVER_HPP
#define TCPSERVER_HPP

#include <iostream>
#include <string>
#include <thread>
#include <vector>
#include <mutex>
#include <atomic>

#if defined(_WIN32) || defined(_WIN64)
#define _WIN32_WINNT 0x0600
#endif

#include <WinSock2.h>

#ifdef _WIN32
#include <ws2tcpip.h>
#else
#include <arpa/inet.h>
#endif

// #pragma comment(lib, "ws2_32.lib")// 加载 winsock2.lib

class TCPServer
{
public:
    TCPServer(unsigned short port);
    ~TCPServer();

    bool start(); // 启动服务器
    void stop();  // 停止服务器

    // 广播消息
    void broadcastMessage(const std::string &message, SOCKET excludeSocket = INVALID_SOCKET);

private:
    // 创建并绑定套接字
    SOCKET createAndBindSocket(unsigned short port);

    // 监听客户端连接
    void listenForClients();

    // 处理客户端
    void handleClient(SOCKET clientSocket);

    std::atomic<bool> m_isRunning;            // 服务器运行标志
    unsigned short m_port;                    // 服务器端口
    SOCKET m_serverSocket;                    // 服务器套接字
    std::thread m_listenThread;               // 监听线程
    std::vector<std::thread> m_clientThreads; // 客户端线程
    std::mutex m_clientMutex;                 // 客户端互斥锁
    std::vector<SOCKET> m_clientSockets;      // 存储客户端套接字
};

#endif // TCPSERVER_HPP